import * as mars3d from "mars3d"


const Cesium = mars3d.Cesium;

// 参考火星科技示例：http://mars3d.cn/editor-vue.html?key=ex_5_0_0&id=layer-tileset/type/basis&data=qx-shequ

export function load3DTileMapConfig(map:mars3d.Map){
  // NOTE:处理3dtile加载时的光照
  map.fixedLight = true // 固定光照，避免gltf模型随时间存在亮度不一致。

  // 固定光照时间
  map.clock.currentTime = Cesium.JulianDate.fromDate(new Date("2022-11-01 12:00:00"))
  // map.clock.shouldAnimate = false

  // 固定光照方向
  map.scene.light = new Cesium.DirectionalLight({
    direction: map.scene.camera.direction
  })
  map.camera.percentageChanged = 0.001
  map.on(mars3d.EventType.cameraChanged, function (event) {
    map.scene.light.direction = map.scene.camera.direction
  });

  // 添加亮度效果
  addbrightnessEffect(map,1.5);

  // 调试面板
  // map.viewer.extend(Cesium.viewerCesiumInspectorMixin);
  map.scene.globe.depthTestAgainstTerrain = false;

//   // 针对不同终端的优化配置
//   if (isPCBroswer()) {
//     // Cesium 1.61以后会默认关闭反走样，对于桌面端而言还是开启得好，
//     map.scene.postProcessStages.fxaa.enabled = true

//     // 鼠标滚轮放大的步长参数
//     map.scene.screenSpaceCameraController._zoomFactor = 2.0

//     // IE浏览器优化
//     if (window.navigator.userAgent.toLowerCase().indexOf("msie") >= 0) {
//       map.viewer.targetFrameRate = 20 // 限制帧率
//       map.viewer.requestRenderMode = true // 取消实时渲染
//     }
//   } else {
//     // 鼠标滚轮放大的步长参数
//     map.scene.screenSpaceCameraController._zoomFactor = 5.0

//     // 移动设备上禁掉以下几个选项，可以相对更加流畅
//     map.viewer.requestRenderMode = true // 取消实时渲染
//     map.scene.fog.enabled = false
//     map.scene.skyAtmosphere.show = false
//     map.scene.globe.showGroundAtmosphere = false
//   }
}

export function load3DTileLayer(name:string,URL:string,popup:any){
  let tiles3dLayer = new mars3d.layer.TilesetLayer({
    name: name,
    url: URL,
    // position: { alt: 148.2 },//不太清楚作用
    maximumScreenSpaceError: 1,
    maxMemory: 1024, // 最大缓存内存大小(MB)
    cullWithChildrenBounds: false,
    skipLevelOfDetail: true,
    preferLeaves: true,
    popup:popup,
    // center: { lat: 28.439577, lng: 119.476925, alt: 229, heading: 57, pitch: -29 },

    // queryParameters: {
    //   // 可以传自定义url参数，如token等
    //   token: "mars3d"
    // },
    // enableDebugWireframe: true, // 是否可以进行三角网的切换显示
    flyTo: false
  });

  tiles3dLayer.readyPromise.then(function (layer) {
    console.log("load完成", layer)

    setStyle1(layer);

    // tiles3dLayer.tileset 是 Cesium3DTileset，支持绑定所有Cesium原生事件
    // 参考API http://mars3d.cn/api/cesium/Cesium3DTileset.html
    tiles3dLayer.tileset.loadProgress.addEventListener(function (numberOfPendingRequests, numberOfTilesProcessing) {
      if (numberOfPendingRequests === 0 && numberOfTilesProcessing === 0) {
        console.log("Loading: 停止加载")
        return
      }
      console.log(`Loading: 待处理请求数: ${numberOfPendingRequests}, 处理数: ${numberOfTilesProcessing}`)
    })
  })

  // 加载的事件 只执行一次
  tiles3dLayer.on(mars3d.EventType.initialTilesLoaded, function (event) {
    console.log("触发initialTilesLoaded事件", event)
  })

  // 会执行多次，重新加载一次完成后都会回调
  tiles3dLayer.on(mars3d.EventType.allTilesLoaded, function (event) {
    console.log("触发allTilesLoaded事件", event)
  })


  return tiles3dLayer;
}


// 开启亮度
function addbrightnessEffect(map:mars3d.Map,brightness:number) {
    let brightnessEffect = new mars3d.effect.BrightnessEffect({
        enabled: false,
        brightness
    });
    map.addEffect(brightnessEffect);
}
  
// mars3d 内置marsJzwStyle属性
export function setStyle1(tiles3dLayer:mars3d.layer.TilesetLayer) {
    console.log("style1");

    tiles3dLayer.customShader = undefined
  
    tiles3dLayer.marsJzwStyle = true // 打开建筑物特效（内置Shader代码）
  
    // BUG:需要根据建筑实际高度来调整效果
    tiles3dLayer.marsJzwStyle = {
      baseHeight: 100.0, // 物体的基础高度，需要修改成一个合适的建筑基础高度
      heightRange: 280.0, // 高亮的范围  (baseHeight ~ baseHeight + heightRange)
      glowRange: 300.0 // 光环的移动范围
    }
}


// customShader参数方式
export function setStyle2(tiles3dLayer:mars3d.layer.TilesetLayer) {
    console.log("style2");

  tiles3dLayer.marsJzwStyle = false
  tiles3dLayer.customShader = new Cesium.CustomShader({
    lightingModel: Cesium.LightingModel.UNLIT,
    fragmentShaderText: `
      void fragmentMain(FragmentInput fsInput, inout czm_modelMaterial material)
      {
        vec4 position = czm_inverseModelView * vec4(fsInput.attributes.positionEC,1); // 位置

        // BUG:只有heightRange为280，glowRange为300才能看到效果
        // 注意shader中写浮点数是，一定要带小数点，否则会报错，比如0需要写成0.0，1要写成1.0
        float _baseHeight = 50.0; // 物体的基础高度，需要修改成一个合适的建筑基础高度
        float _heightRange = 280.0; // 高亮的范围(_baseHeight ~ _baseHeight + _heightRange)
        float _glowRange = 300.0; // 光环的移动范围(高度)

        // 建筑基础色
        float mars_height = position.z - _baseHeight;
        float mars_a11 = fract(czm_frameNumber / 120.0) * 3.14159265 * 2.0;
        float mars_a12 = mars_height / _heightRange + sin(mars_a11) * 0.1;

        material.diffuse = vec3(0.0, 0.0, 1.0); // 颜色
        material.diffuse *= vec3(mars_a12);// 渐变

        // 动态光环
        float time = fract(czm_frameNumber / 360.0);
        time = abs(time - 0.5) * 2.0;
        float mars_h = clamp(mars_height / _glowRange, 0.0, 1.0);
        float mars_diff = step(0.005, abs(mars_h - time));
        material.diffuse += material.diffuse * (1.0 - mars_diff);
      } `
  })
}